perm filename PLAY.FAI[IRC,LCS] blob sn#247966 filedate 1977-03-30 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	SOUND  DOROTHY BENDER MEMORIAL TITLE 1969,69,69, 1975(LCS)*******
C00017 ENDMK
C⊗;
	TITLE	SOUND;  DOROTHY BENDER MEMORIAL TITLE 1969,69,69, 1975(LCS)*******

;  ROUTINE TO READ THE OUTPUT FROM THE MUSIC
;  PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
;  
;  NAME OF THE FILE TO BE INPUTTED IS 'TEST.SND',
;  THE FIRST RECORD OF WHICH CONTAINS THE
;  NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.

EXTERNAL JOBREL
A   ←   1     ;WORK
B   ←   2     ;WORK
RET ←   3     ;RETURN ACCUMULATOR
T1  ←   4     ; TEMP FOR ADSMAP (JAM)
BUFCNT ← 5	;USED IN REPLAY FEATURE TO KEEP TRACK OF BUFFER NUM.
REP ← 6;	;FOR REPLAY USETI
;****P ← 17
;;BUFSIZ ←=20224   ;****** DOUBLE THIS FOR 4-CHANNEL SOUND!!!!!	
BUFSIZ ←4400*5 	;OPTIMIZED FOR 3330 DSK. (←4400*3 IN SYS VERSION)
↓DSKCHN ←1             ;DISK CHANNEL FOR INPUT
↓ADCHN  ←2             ;D-A CHANNEL FOR OUTPUT
;****PDL:	BLOCK 10
	OPDEF	READCH [51B8]
        OPDEF   MESSAGE[51B8!3B12]

BEG:	CALLI	0,0         ;RESET I/O DEVICES
 	OPEN 	DSKCHN,[17  ;MODE
		'DSK   '    ;DEVICE NAME
 		0]          ;NO BUFFER HEADERS
	HALT	BEG         ;RESTART IF DEVICE IS UNAVAILABLE

	MOVE 6,['TEST  ']
	MOVE 7,['SND   ']
 	SETZM	DIR2+3    ;FOR RESTART
 	SETZM	DIR+3    ;FOR RESTART
	OUTSTR[ASCIZ/FILE NAME -- /]  
	SETZM DIR+1
	SETZM DIR
	SETO 5,		;FLAG FOR EXTENSIONS
	MOVE  2,[POINT 6,DIR]
	MOVEI "1"	;INIT SAVSPD
	MOVEM SAVSPD#
	SETZM XGHLD	;FLAG FOR XGHOLD SET TO 0
	JRST GOT
EXT:	MOVE 2,[POINT 6,DIR+1]
	SETZ 5,
GOT:	INCHWL	1
	CAIN  1,15	; A CR?
	JRST  GOT
	CAIGE	1,60		; CHECKS FOR GOOD CHARS.
	JRST	LX  
	SUBI	1,40
	IDPB	1,2
	JRST	GOT
LX:	JUMPE 5,LZ
	SKIPN DIR
	MOVEM 6,DIR
	CAIN  1,56 	; 56='.'
	JRST EXT
	JRST MESS
LZ:	SKIPN DIR+1
	MOVEM 7,DIR+1
MESS:	MESSAGE [ASCIZ/
SPEED←1: TYPE <S> TO CHANGE IT.     BYTE←12: TYPE <B> TO CHANGE IT.

NCHNS←1: TYPE <N> TO CHANGE IT.     TYPE <Rn> TO REPEAT n TIMES. /]
	SETZM REP	; FOR SPEED CHNGS WITH HEADER
	MOVEI A,1
	DPB	A,[POINT 2,DACPAR,35]
	JRST SPD
;****BYTCH:	PUSHJ P,CR
BYTCH:	MESSAGE [ASCIZ/ITS
0=12 BITS, 1=18 BITS.  /]
	READCH A
	CAIN A,15		; A CR?
	JRST LF			; GET THE LF
	CAIE A,61		;61 IS CHAR. 1   1=18, ANYTHING ELSE=0
	JRST .+3
	MOVEI A,1
	JRST BITS 
	SETZ A,
BITS:	DPB	A,[POINT 2,DACPAR,29]			;12 OR 18 BIT
;****	JRST SPX
	JRST SPD
;****NCHNS:	PUSHJ P,CR
NCHNS:	MESSAGE	[ASCIZ/CHNS
  HOW MANY CHANNELS? /]
	READCH	A		;FIND OUT NUMBER OF CHANNELS AND THE SPEED.
	CAIN A,15		; A CR?
	JRST LF			; GET THE LF
	SUBI	A,"0"		;CONVERT TO BINR
	DPB	A,[POINT 2,DACPAR,35]
;****	JRST SPX
	JRST SPD
;****SPEED:	PUSHJ P,CR
SPEED:	MESSAGE [ASCIZ/PEED
0=6.4K  1=12.8  2=25.6  3=51.2  4=102.8  5=204.8  /]
	READCH A
	CAIN A,15		; A CR?
	JRST LF			; GET THE LF
	CAILE A,"5"		;IS IT 1 - 5?
	JRST SPEED 		; BAD SPEED, TRY AGAIN.
SPD3:	DPB A,[POINT 3,DACPAR,26]		;PUT AWAY THE SPEED
;****	JRST SPX
	JRST SPD
LF:	READCH A		;GET THE LF
        JRST SPD		;IGNORE IT AL
;****CR:	CAIN A,12		;IS IT A LF ALREADY?
;****	POPJ P,			; GO BACK THEN.
;****	READCH B
;****	CAIE B,15		; A CR?
;****	JRST CR			; NO, GOBBLE ANOTHER CHAR.
;****	READCH B		; GET THE LF
;****	POPJ P,

XGHOLD:	SETOM XGHLD#		;SET XGHOLD FLAG TO -1
	MESSAGE [ASCIZ/ WILL HOLD XGP & DAC/]
;****SPX:	PUSHJ P,CR			;GO GET CRLF
SPD:	MESSAGE [ASCIZ/

PLAY? /]
	SETOM REPT#		;FOR MULTIPLE PLAYS WITH Rn
	READCH  A
	CAIN A,"N"
	JRST NCHNS		;N=NCHNS, B=BYTE, S=SPEED, R=REPEAT
	CAIN A,"B"
	JRST BYTCH
	CAIN A,"+"		;TYPE + TO HOLD ON TO XGP
	JRST XGHOLD
	CAIE A,"-"		; - LETS LOOSE
	JRST .+5
	RELEASE ADCHN,
;;;	RELEASE 16,
	MESSAGE [ASCIZ/ XGP & DAC RELEASED /]
	SETZM XGHLD
;****	JRST SPX  
	JRST SPD
	CAIN A,"S"
	JRST SPEED
	CAIN A,15	; IS IT A CRLF???
;****	JRST PLLF	; YES, GO TO 'GO'.
	JRST PLA2
	CAIE A,"R"		;TYPE Rn TO REPEAT n TIMES, NO PAUSE
	JRST PLA2		;ELSE GO PLAY SAME AS LAST TIME
REP3:	MESSAGE [ASCIZ/EPEAT  /]
	READCH A		;GET NUM FOLLOWING R.
	SUBI A,"0"		;MAKE BIN.
	CAILE A,=9		;IF(A.GT.9)A=1  TRAPS "G"  ETC.
	MOVEI A,1
	MOVNM A,REPT		;REPEATS UP TO 9 TIMES.
	MOVE A,SAVSPD		;GET BACK SPEED.
	JRST PLA2 
;****PLLF:	READCH A		;GET THE LF.
;****	JRST PLA2+1
SPD2:	MOVEM A,SAVSPD#		;SAVE AC A.
;****PLA2:	PUSHJ P,CR
PLA2:	SETZM DIR+3
	SETZM DIR2+3
	MOVE 5,SND		;GET 'SND   '
	LOOKUP	DSKCHN,DIR   
	SKIPA			;CAN'T FIND TEST.SND 
	JRST XOPEN		;FOUND IT
	CAMN 5,DIR+1		;IS DIR+1='SND   '?
	JRST MUS		;YES, GO LOOK FOR MUSIC.MUS
	MOVEM 5,DIR+1
	JRST PLA2+1
MUS:	LOOKUP  DSKCHN,DIR2	;TRY FOR MUSIC.MUS

	JRST	[MESSAGE[ASCIZ/
		*** MUSIC FILE NOT FOUND/]
		CALLI  12]
        ;EXIT IF FILE IS MISSING
;;	MOVE A,DIR2+3	;GET LENGTH OF FILE     
;;	MOVEM A,DIR+3;PUT IT IN RIGHT PLACE

XOPEN:	OPEN	ADCHN,[1B27+117	;MODE
         	'DAC   '        ;DEVICE NAME
 		0]              ;NO BUFFER HEADERS
	SKIPA
;;;	JRST XGPOK-1		;WE GOT THE DAC, NOW TRY FOR THE XGP!
	JRST SPWAR-1		;GO AHEAD
        MESSAGE [ASCIZ/
WAITING FOR DAC------ /]
	OPEN  ADCHN,[1B26+117	;WE'LL WAIT FOR IT
		  'DAC   '
		  0]
	0			;NO FAILURE POSSIBLE?????
	MTAPE ADCHN,DACPAR
;;;XGPOK:	OPEN     16,[1B27	;DOWN TO SPWAR FOR XGP CONFLICT.
;;;		'XGP   '   	;DEVICE NAME
;;;		0]
;;;	SKIPA
;;;	JRST SPWAR;		;WE GOT THE XGP
;;;	MOVSI A,'XGP'		;IS THE XGP INITTED OR ASSIGNED?
;;;	DEVUSE A,
;;;	TLNN A,77		;OR IS IT JUST DETACHED?
;;;	TLNN A,400000		; IS IT INITTED?
;;;	JRST WAIT
;;;	JRST SPWAR		;IT'S DETACHED, SO GO AHEAD AND PLAY.
;;;WAIT:	MESSAGE [ASCIZ/
;;;WAITING FOR XGP------ /]
;;;	OPEN     16,[1B26 
;;;	         'XGP   '
;;;		 0]
;;;	0			;IT HAD BETTER NOT FAIL.
SPWAR:	HRRZ	A,JOBREL
	HRRZM	A,OLDREL#
	HRRZM	A,BUF1
	HRRZI	A,1(A)
	HRRM	A,HEADER
	ADDI	A,BUFSIZ
	HRRZM	A,BUF2
	ADDI	A,BUFSIZ+1
	HRRZM	A,BUF3
	ADDI	A,BUFSIZ+2
	CORE	A,
	JRST	[OUTSTR[ASCIZ/
	CAN'T GET CORE!
/]↔	JRA	16,2(16)]

	LOCK A,			;SPWAR:

	MESSAGE [ASCIZ/ GO? /]
;****	PUSHJ P,CR
	READCH A
	CAIN A,15
	READCH A		;FOR CRLF
	; READS TO FIND (AND IGNORE) HEADER.(1ST REC.)
DOIT:	SETO BUFCNT,		;KEEP TRACK OF WHICH BUFFER, FOR REPLAY
	SKIPE REP		;SKIP FIRST TIME
	JRST REPLA		;OMIT HEADER ON REPLAYS
	MOVEI REP,1 		;FOR REPLAY
	INPUT DSKCHN,HEADER
	HRRZ A,HEADER
	HRRZ B,1(A)
	CAIE B,525252	; LOOKS FOR MAGIC NUMBER.
	JRST REPLA
	MESSAGE [ASCIZ/
---- THERE'S A HEADER ---- /]
	HLRZ B,2(A)			;GET SPEED FROM LEFT HALF OF WD 2
	DPB B,[POINT 3,DACPAR,26]		;PUT AWAY THE SPEED
	HRRZ B,3(A)			;GET BITS FROM RIGHT HALF OF WD 3
	DPB B,[POINT 2,DACPAR,29]			;12 OR 18 BIT
	MOVE B,4(A)			;GET NCHNS FROM WD 4
	DPB B,[POINT 2,DACPAR,35]
	MTAPE ADCHN,DACPAR	;NOW USE ALL THE STUFF FROM THE HEADER
	MOVEI REP,2		;FOR REPLAY
	SKIPA
REPLA:	USETI DSKCHN,(REP)	;REP=1 IF NO HEADER, =2 WITH HEADER.
LNTH:	movs a,DIR+3		;get length of file.
	CAIN REP,2		;WAS THERE A HEADER?
	ADDI A,200		;YES, SUBTRACT IT FROM WDCNT.
	movnm a,nwd
;-----------------------------------------------------

	;BEGIN MAIN BODY OF PROGRAM

	MOVE T1,[647003,,0]
	ADSMAP T1,	; SET AUDIO SWITCH TEMPORARILY TO DAC (JAM 7/24/75)
			; THE OPTIONS WE ASKED FOR ARE TEMPORARY, WAIT FOR
			; PAGE TO FINISH, DON'T INTERRUPT WITH MORE PAGES,
			; DELAY BEEPS TO END OF XFR.
	OUTSTR [ASCIZ /
TO DAC . . ./]
	JUMPE BUFCNT,LOOP2
	JUMPG BUFCNT,LOOP3	;TO START ON CORRECT BUFFER WHEN REPLAYING
LOOP:	JSP	RET,SUB		;ROUTINE TO READ AND WRITE
BUF1:	0			;USE BUF1 FOR THE I/O
	AOS BUFCNT
	JUMPLE	B,DONE    	;DONE
	
LOOP2:	JSP RET,SUB
BUF2:	0
	AOS BUFCNT
	JUMPLE B,DONE

LOOP3:	JSP	RET,SUB		;CALL IT AGAIN
BUF3:	0			;USE BUF3 FOR THE I/O
	SETO BUFCNT,		; RE-INIT BUFFER COUNTER, FOR REPLAY
	JUMPG	B,LOOP		;GO BACK FOR MORE IF B>0

DONE:	AOSGE REPT		;UPDATE REPT
	JRST REPLA		;WE PLAY AGAIN IF REPT .LT.0
	close dskchn,		;END OF PROGRAM.
	SKIPL XGHLD		;FOR GREED'S SAKE
	releas adchn,
	OUTSTR [ASCIZ / DONE!
/]
	SETO T1,
	ADSMAP T1,	; RESET AUDIO SWITCH CONNECTION TO PERMANENT (JAM 7/24/75)
;;	SPCWAR 0,'SSW'
	UNLOCK
;;;	SKIPL XGHLD		;FOR GREED'S SAKE
;;;	RELEASE 16,
	HRRZ A,OLDREL
	CORE A,
	0		;DON'T THINK OF FAILURE
	jrst SPD

	;SUBROUTINE TO SET UP IOWD AND READ AND WRITE.
	;  1(RET) WILL BE THE RETURN
	;  0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
	;         PUT IN THE RIGHT HALF OF THE IOWD.
	;  A      WILL BE A WORK REGISTER
    	;  B      WILL BE TESTED ON THE OUTSIDE.

SUB:	MOVNI	A,BUFSIZ	;PICK UP AND COMPLEMENT BUFSIZ
	ADDB	A,NWD		;A←NWD-BUFSIZ
				;NWD←NWD-BUFSIZ
	MOVE	B,A		;SAVE B TO BE TESTED FOR LAST
				;TIME.
	JUMPL	A,LAST		;SET UP FOR LAST TIME.
	MOVEI	A,0		

	;THE IOWD LOOKS LIKE:
	;  [-BUFSIZ / BUFI-1]

LAST:	ADDI	A,BUFSIZ
	MOVNS	A		;COMPLEMENT A
	HRL	A,0(RET)	;PICK UP BUFI AND MOVE IT
				;TO THE LEFT SIDE OF A.
	MOVSM	A,INLIST	;SWAP A AND MOVE IT.
	MOVSM	A,OUTWC		;SAME FOR OUTPUT.
	INPUT	DSKCHN,INLIST	;READ A RECORD.
	OUTPUT	ADCHN,OUTWC	;WRITE THE RECORD.
	JRST	1(RET)		;RETURN
;---------------------------------------------------------

; STORAGE:

NWD:	0			;FOR NUMBER OF WORDS OF INPUT.
;;↓BUF1:	BLOCK	BUFSIZ+1	;BUFFER 1
;;BUF2:	BLOCK	BUFSIZ+1	;BUFFER 2
;;BUF3:	BLOCK	BUFSIZ+1	;BUFFER 3

SND:	'SND   '
DIR2:	'TEST  '		;FILENAME FOR INPUT
	'SND   '			;EXTENSION
	0			;INFORMATION ON FILE
	0			;PROJECT PROG#
DIR:	0    			;NAME
	0			;EXTENSION
	0			;INFORMATION ON FILE
	0			;PROJECT PROG#
CLIST:	IOWD	1,NWD		;FOR THE FIRST RECORD
	0
INLIST:	0			;WILL CONTAIN AN IOWD
	0
HEADER:	IOWD =128,BUF1
	0
OUTWC:	0			;WILL CONTAIN AN IOWD FOR D-A
;;	3650			;MAGIC BITS FOR 136.
OUTBIT: 4000			;BITS FOR D-A
	BLOCK	2
DACPAR:	1001		;SPEED 0=6.4K, 1=12.8, 2=25.6, 3=51.2, 4=102.4, 5=
	0
	0


A←1
B←2
D←3

ichn←adchn

END BEG